/*!
 * \file WtMsgQue.cpp
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 消息队列模块C接口实现
 * 
 * \details 本文件实现了WonderTrader消息队列系统的C语言接口：
 *          - 实现消息服务器和客户端的管理功能
 *          - 提供消息发布和订阅的统一接口
 *          - 封装底层UDP通信细节
 *          - 支持跨语言调用的C接口
 *          - 提供线程安全的消息队列操作
 */
#include "WtMsgQue.h"
#include "MQManager.h"

#ifdef _MSC_VER
#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "Mswsock.lib")
#pragma comment(lib, "nanomsg.lib")
#endif

USING_NS_WTP;

/**
 * @brief 获取消息队列管理器实例
 * @details 返回全局唯一的消息队列管理器实例，采用单例模式
 * @return MQManager& 消息队列管理器引用
 */
MQManager& getMgr()
{
	static MQManager runner;
	return runner;
}

/**
 * @brief 注册回调函数
 * @details 注册日志回调函数，用于接收消息队列系统的日志信息
 * @param cbLog 日志回调函数指针
 */
void regiter_callbacks(FuncLogCallback cbLog)
{
	getMgr().regiter_callbacks(cbLog);
}

/**
 * @brief 创建消息服务器
 * @details 创建UDP消息服务器，用于发布消息到指定主题
 * @param url 服务器URL地址（格式：udp://ip:port）
 * @param confirm 是否需要确认机制
 * @return WtUInt32 服务器ID，用于后续操作标识
 */
WtUInt32 create_server(const char* url, bool confirm)
{
	printf("create server\r\n");
	return getMgr().create_server(url, confirm);
}

/**
 * @brief 销毁消息服务器
 * @details 销毁指定ID的消息服务器，释放相关资源
 * @param id 服务器ID
 */
void destroy_server(WtUInt32 id)
{
	getMgr().destroy_server(id);
}

/**
 * @brief 发布消息
 * @details 向指定主题发布消息数据
 * @param id 服务器ID
 * @param topic 消息主题
 * @param data 消息数据指针
 * @param dataLen 消息数据长度
 */
void publish_message(WtUInt32 id, const char* topic, const char* data, WtUInt32 dataLen)
{
	getMgr().publish_message(id, topic, data, dataLen);
}

/**
 * @brief 创建消息客户端
 * @details 创建UDP消息客户端，用于订阅和接收消息
 * @param url 服务器URL地址（格式：udp://ip:port）
 * @param cb 消息回调函数，用于处理接收到的消息
 * @return WtUInt32 客户端ID，用于后续操作标识
 */
WtUInt32 create_client(const char* url, FuncMQCallback cb)
{
	return getMgr().create_client(url, cb);
}

/**
 * @brief 销毁消息客户端
 * @details 销毁指定ID的消息客户端，释放相关资源
 * @param id 客户端ID
 */
void destroy_client(WtUInt32 id)
{
	getMgr().destroy_client(id);
}

/**
 * @brief 订阅主题
 * @details 订阅指定主题的消息，只有订阅的主题消息才会被接收
 * @param id 客户端ID
 * @param topic 要订阅的主题名称
 */
void subscribe_topic(WtUInt32 id, const char* topic)
{
	return getMgr().sub_topic(id, topic);
}

/**
 * @brief 启动客户端
 * @details 启动消息客户端，开始接收消息
 * @param id 客户端ID
 */
void start_client(WtUInt32 id)
{
	getMgr().start_client(id);
}
